library(ggplot2)
library("cowplot")
library(ggpubr)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Attaching package: ‘ggpubr’

The following object is masked from ‘package:cowplot’:

    get_legend
library(phyloseq)
library (ggsci)

rr my16stheme <- theme_bw()+ theme(plot.title = element_text(family =, face = , size = (25)), panel.background = element_blank(), panel.border = element_rect(fill=NA,color = , size = 1), panel.spacing= unit(0.7,), strip.text= element_text(size=20, family =, face=), legend.title = element_text(colour = , face = ,family =,size = (20)), legend.text = element_text(face = , colour=,family = ,size = (18) ), axis.title = element_text(family = , face = , size = (20), colour = ), axis.text = element_text(family = ,face = , colour = , size = (18)))

#Data import
phy <- readRDS("breathe_sputum_phyloseq_trial_13Dec2021.RDS")
Trial <-data.frame (sample_data(phy))

#----------__Subsettting data-----------------
colnames(Trial)
  [1] "templateDNA_16SqPCR_copies" "Shannon"                    "Simpson"                   
  [4] "InvSimpson"                 "site"                       "studyno"                   
  [7] "acut_exac12m"               "hospitalised12m"            "reason_hospi"              
 [10] "antibiotic12m"              "any3_reasons"               "any3_reasons.1"            
 [13] "adherence"                  "visit"                      "visit_date"                
 [16] "fev1z"                      "weight"                     "height"                    
 [19] "weightcat"                  "f24mrcscore"                "f41shuty"                  
 [22] "FEV1_baseline"              "FEVpcpred"                  "FVC"                       
 [25] "FVCZ"                       "FVCpcpred"                  "FEV1FVC"                   
 [28] "FEV1FVCZ"                   "cd4"                        "vload"                     
 [31] "sex"                        "dob"                        "bmi"                       
 [34] "agey"                       "zwauk"                      "zhauk"                     
 [37] "zbmiuk"                     "vllog"                      "vlsup"                     
 [40] "vlsup400"                   "vlsup40"                    "normalbmi"                 
 [43] "normalwaz"                  "normalhaz"                  "durartgp"                  
 [46] "cd4gp"                      "agegpsym"                   "abnrr"                     
 [49] "abnsat"                     "abnhr"                      "startfollowup"             
 [52] "enrolmonth"                 "agegp"                      "ageyart"                   
 [55] "duryart"                    "duryartgp"                  "attendschool"              
 [58] "datehiv"                    "artdrug1stline"             "artdrug2ndline"            
 [61] "endfollowup"                "exitreason"                 "dow"                       
 [64] "dod"                        "lastvisit"                  "visittotno"                
 [67] "lastvisitdate"              "endtreatddate"              "endtreatdate"              
 [70] "treatstopreason"            "group"                      "f25cough"                  
 [73] "f11cotri"                   "f13drugs_3tc"               "f13drugs_abc"              
 [76] "f13drugs_atv"               "f13drugs_azt"               "f13drugs_d4t"              
 [79] "f13drugs_ddi"               "f13drugs_efv"               "f13drugs_lpv"              
 [82] "f13drugs_nvp"               "f13drugs_tnf"               "f13drugs_other"            
 [85] "f13drugs_spec"              "f14adm"                     "f15nadm"                   
 [88] "f16tbtreat"                 "f17notbtreat"               "f18breathe"                
 [91] "f27sputum"                  "sc04sccurrent"              "sc05gradesc"               
 [94] "sc06misssc"                 "sc08repsc"                  "artreg"                    
 [97] "sp03date"                   "sampling_month"             "colmonthgp_mal2"           
[100] "colmonthgp_mal3"            "colmonthgp_zim3"            "colmonthgp1"               
[103] "colmonthgp2"                "sp05time"                   "sp06spvol"                 
[106] "sp07indid"                  "sp08ind"                    "sp09nosamp"                
[109] "sp10osat"                   "sp11eff_bleed"              "sp11eff_vomit"             
[112] "sp11eff_wheeze"             "sp11eff_breath"             "sp11eff_cough"             
[115] "sp11eff_none"               "sp12bdr"                    "sp13osata"                 
[118] "trial_arm"                  "sp14bcode"                  "sp15comm"                  
[121] "sp16dater"                  "sp17date2"                  "collection_date_redcap"    
[124] "sp18labnopr"                "comments_from_lab"          "names"                     
[127] "all_3"                      "visit012"                   "visit1218"                 
[130] "visit018"                   "only2visits"                "one_visit"                 
[133] "studyno_baseline"           "ageyenrl_baseline"          "agegpenrl_baseline"        
[136] "ageyart_baseline"           "duryart_baseline"           "duryartgp_baseline"        
[139] "weightcat_baseline"         "FEV1_baseline.1"            "f25cough_baseline"         
[142] "f24mrcscore_baseline"       "f36rr_baseline"             "f37hr_baseline"            
[145] "f38sat_baseline"            "f11cotri_baseline"          "f14adm_baseline"           
[148] "f15nadm_baseline"           "f16tbtreat_baseline"        "f17notbtreat_baseline"     
[151] "f18breathe_baseline"        "f27sputum_baseline"         "attendschool_baseline"     
[154] "sc05gradesc_baseline"       "sc06misssc_baseline"        "sc08repsc_baseline"        
[157] "cd4enrl_baseline"           "vlenrl_baseline"            "datehiv_baseline"          
[160] "artdrug1stline_baseline"    "artdrug2ndline_baseline"    "ysincediag_baseline"       
[163] "ageatdiagy_baseline"        "ageatarty_baseline"         "shutm_baseline"            
[166] "artreg_baseline"            "mrcgr1_baseline"            "bmienrl_baseline"          
[169] "zwaukenrl_baseline"         "zhaukenrl_baseline"         "zbmiukenrl_baseline"       
[172] "vlenrllog_baseline"         "vlenrlsup_baseline"         "vlenrlsup400_baseline"     
[175] "vlenrlsup40_baseline"       "normalbmi_baseline"         "normalwaz_baseline"        
[178] "normalhaz_baseline"         "durartgp_baseline"          "cd4gp_baseline"            
[181] "agegpsym_baseline"          "abnrr_baseline"             "abnsat_baseline"           
[184] "abnhr_baseline"            
summary(Trial$templateDNA_16SqPCR_copies)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    169   25952   95830  355481  346819 7786891 
Trial$templateDNA_16SqPCR_copies <-log10(Trial$templateDNA_16SqPCR_copies)
summary(Trial$templateDNA_16SqPCR_copies)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.227   4.414   4.982   4.952   5.540   6.891 
#------Trial arms- How many samples were collected from site-at each timepoint------------

#use trial arms data and split into timepoints to compute data collected at each for each arm
tmpt_1 <-Trial[which(Trial$visit=="Baseline"),]#331
tmpt_12<-Trial[which(Trial$visit=="Week 48"),]#304
tmpt_18<-Trial[which(Trial$visit=="Week 72"),]#240

#---Prevalence Totals in main trial data-------------
#Subsetting data into AZM and placebo
AZM<-Trial[which(Trial$trial_arm=="AZM"),]#441
Placebo<-Trial[which(Trial$trial_arm=="Placebo"),]#434

AZM1<-tmpt_1[which(tmpt_1$trial_arm=="AZM"),]#164
AZM12<-tmpt_12[which(tmpt_12$trial_arm=="AZM"),]#154
AZM18<-tmpt_18[which(tmpt_18$trial_arm=="AZM"),]#123

AZM012<-AZM[which(AZM$visit!="Week 72"),]
AZM012p<-AZM[which(AZM$visit!="Week 72" & AZM$visit012=="yes"),]
AZM1218p<-AZM[which(AZM$visit!="Baseline" & AZM$visit1218=="yes"),]
AZM018p<-AZM[which(AZM$visit!="Week 48" & AZM$visit018=="yes"),]
AZM3p<-AZM[which(AZM$all_3=="yes"),]



Plac1<-tmpt_1[which(tmpt_1$trial_arm=="Placebo"),]#167
Plac12<-tmpt_12[which(tmpt_12$trial_arm=="Placebo"),]#150
Plac18<-tmpt_18[which(tmpt_18$trial_arm=="Placebo"),]#117

Placebo012p<-Placebo[which(Placebo$visit!="Week 72" & Placebo$visit012=="yes"),]
Placebo1218p<-Placebo[which(Placebo$visit!="Baseline" & Placebo$visit1218=="yes"),]
Placebo018p<-Placebo[which(Placebo$visit!="Week 48" & Placebo$visit018=="yes"),]
Placebo3p<-Placebo[which(Placebo$all_3=="yes"),]
summary(AZM12$templateDNA_16SqPCR_copies)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.406   4.077   4.646   4.620   5.207   6.378 

#AZM and Placebo at all visits

rr azmplac<-ggplot(Trial, aes(x=trial_arm, y=templateDNA_16SqPCR_copies, shape=trial_arm, fill=trial_arm)) + geom_jitter(width = 0.2)+ geom_boxplot()+ scale_fill_manual(values=c(#A087BC, #FFF468))+ facet_wrap()+coord_cartesian(ylim = c(2, 8))+ #stat_summary(fun = ,size = 0.5)+ stat_compare_means( method= .test,comparisons=list(c(, )), size=6)+ labs(x=NULL, y=\16S copies in log10)+my16stheme azmplac

#AZM at baseline and 48 weeks

rr fig1<-ggpaired(AZM012p,x=, y=_16SqPCR_copies, line.size = 0.1,line.color = #5C5B58, fill = , palette= c(#E1D0FF, #8662BD))+coord_cartesian(ylim = c(2, 8))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(, 48)), size=6)+ labs(x=at Baseline and 48 (n=146), y=\16S copies in log10)+my16stheme+theme(legend.position=) fig1

#AZM at 48 and 72 weeks

rr fig2<-ggpaired(AZM1218p,x=, y=_16SqPCR_copies, line.size = 0.1, line.color = #5C5B58,fill = , palette= c(#8662BD, #32224A))+coord_cartesian(ylim = c(2, 8))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(48, 72)), size=6)+ labs(x=at Week 48 and 72 (n=116), y=\16S copies in log10)+my16stheme+theme(legend.position=) fig2

#AZM at baseline and 72 weeks

rr fig3<-ggpaired(AZM018p,x=, y=_16SqPCR_copies, line.size = 0.1,line.color = #5C5B58, fill = ,palette= c(#E1D0FF, #32224A))+coord_cartesian(ylim = c(2, 8))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(, 72)), size=6)+ labs(x=at Week 48 and 72 (n=115), y=\16S copies in log10)+my16stheme+theme(legend.position=) fig3

#Obtaining legends #AZM

rr library (ggsci) fig1leg<-ggpaired(AZM3p,x=, y=_16SqPCR_copies, line.size = 0.1,line.color = , fill = , palette= c(#E1D0FF,#8662BD,#32224A))+coord_cartesian(ylim = c(2, 8))+ #stat_compare_means( paired=TRUE, method= ,comparisons=list(c(, 48, 72)), size=6)+ labs(x=at Baseline and 48 (n=146), y=\16S copies in log10)+my16stheme fig1leg

rr

Extract the legend. Returns a gtable

leg <- get_legend(fig1leg)

Convert to a ggplot and print

legAZM<-as_ggplot(leg)

rr library(cowplot) AZM_all_visit16Scopies<-cowplot::plot_grid(fig1,fig2, fig3,legAZM, nrow = 1, ncol = 4, rel_widths = c(2,2,2, 1) , rel_heights = c(2,2,2, 1)) AZM_all_visit16Scopies

#Placebo

rr #Placebo #Baseline and Week 48 fig4<-ggpaired(Placebo012p,x=, y=_16SqPCR_copies, line.size = 0.1, line.color = #5C5B58,fill = , palette= c(#fff9ae, #dab600))+coord_cartesian(ylim = c(2, 8))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(, 48)), size=6)+ labs(x=at Baseline and 48 (n=143), y=\16S copies in log10)+my16stheme+theme(legend.position=)

fig4

rr fig5<-ggpaired(Placebo1218p,x=, y=_16SqPCR_copies, line.size = 0.1, line.color = #5C5B58,fill = , palette= c(#dab600, #554904))+coord_cartesian(ylim = c(2, 8))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(48, 72)),size=6)+ labs(x=at Week 48 and 72 (n=112), y=\16S copies in log10)+my16stheme+theme(legend.position=) fig5

rr NA NA

rr fig6<-ggpaired(Placebo018p,x=, y=_16SqPCR_copies, line.size = 0.1,line.color = #5C5B58, fill = , palette= c(#fff9ae, #554904))+coord_cartesian(ylim = c(2, 8))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(, 72)),size=6)+ labs(x=at Baseline and 72 (n=110), y=\16S copies in log10)+my16stheme+theme(legend.position=) fig6

#Placebo legend

rr library (ggsci) #Placebo3p not working so AZM3p used but with different colors to generate the Placebo legend fig1t<-ggpaired(AZM3p,x=, y=_16SqPCR_copies, line.size = 0.1,line.color = , fill = , palette= c(#fff9ae,#dab600, #554904))+coord_cartesian(ylim = c(2, 8))+ #stat_compare_means( paired=TRUE, method= ,comparisons=list(c(, 48, 72)), size=6)+ labs(x=at all visits, y=\16S copies in log10)+my16stheme fig1t

rr

Extract the legend. Returns a gtable

leg <- get_legend(fig1t)

Convert to a ggplot and print

legPla<-as_ggplot(leg)

rr library(cowplot) Placebo_all_visit16Scopies<-cowplot::plot_grid(fig4,fig5,fig6,legPla, nrow = 1, ncol = 4, rel_widths = c(2,2,2, 1) , rel_heights = c(2,2,2, 1)) Placebo_all_visit16Scopies

rr tem16S<-cowplot::plot_grid(azmplac, AZM_all_visit16Scopies, Placebo_all_visit16Scopies, nrow = 3, ncol = 1, scale = .9, vjust=1.5, hjust= c(-3.5,-6.2,-5.0), labels = c(vs. Placebo at all visits, samples only at all visits, samples only at all visits), label_size = 20, label_fontfamily = , label_fontface = ) tem16S

rr

tem16Sb<-cowplot::plot_grid(azmplac, AZM_all_visit16Scopies, Placebo_all_visit16Scopies, nrow = 3, ncol = 1, scale = .85, vjust=1.5, hjust= c(-1.92,-1.82,-1.6), labels = c() AZM vs. Placebo at all visits, ) AZM samples only at all visits, ) Placebo samples only at all visits), label_size = 20, label_fontfamily = , label_fontface = , label_colour = blue) tem16Sb

ggsave(\16S_copies_final13thDec.pdf, tem16Sb, width = 55, height = 50, units = )

#ALPHA DIVERSITY

#AZM and Placebo at all visits

rr #Shannon #AZM and Placebo at three timepoint #Final azmplacA<-ggplot(Trial, aes(x=trial_arm, y=Shannon, shape=trial_arm, fill=trial_arm)) + geom_jitter(width = 0.2)+coord_cartesian(ylim = c(0, 4.5))+ geom_boxplot()+ scale_fill_manual(values=c(#A087BC, #FFF468))+ facet_wrap()+ #stat_summary(fun = , geom = ,width=0.5,size = 0.5, color = 3)+ stat_compare_means( method= .test,comparisons=list(c(, )),size=6)+ labs( x=NULL, y=index)+ my16stheme azmplacA

#AZM at baseline and 48 weeks

rr #Azithromycin #Baseline and Week 48 fig1A<-ggpaired(AZM012p,x=, y=, line.size = 0.1,line.color = #5C5B58, fill = , palette= c(#E1D0FF, #8662BD))+coord_cartesian(ylim = c(0, 4.5))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(, 48)),size=6)+ labs(x=\(n=146)\, y=\Shannon index\)+my16stheme+theme(legend.position=) fig1A

#AZM at 48 and 72 weeks

rr fig2A<-ggpaired(AZM1218p,x=, y=, line.size = 0.1,line.color = #5C5B58, fill = , palette= c(#8662BD, #32224A))+coord_cartesian(ylim = c(0, 4.5))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(48, 72)),size=6)+ labs(x=\(n=116)\, y=\Shannon index\)+my16stheme+theme(legend.position=, axis.title.y =element_blank(),axis.line = element_line(size = 0.1, colour = ) ) fig2A

#AZM at baseline and 72 weeks

rr fig3A<-ggpaired(AZM018p,x=, y=, line.size = 0.1, line.color = #5C5B58,fill = , palette= c(#E1D0FF, #32224A))+coord_cartesian(ylim = c(0, 4.5))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(, 72)),size=6)+ labs(x=\(n=115)\, y=\Shannon index\)+my16stheme+theme(legend.position=, axis.title.y =element_blank(), axis.line = element_line(size = 0.1, colour = )) fig3A

rr library(cowplot) AZM_all_visitShannon<-cowplot::plot_grid(fig1A,fig2A, fig3A,legAZM, nrow = 1, ncol = 4, rel_widths = c(2.3,2,2, 1) , rel_heights = c(2,2,2, 1), align = AZM_all_visitShannon

#Placebo

rr #Placebo #Baseline and Week 48

fig4A<-ggpaired(Placebo012p,x=, y=, line.size = 0.1,line.color = #5C5B58, fill = ,palette= c(#fff9ae, #dab600))+coord_cartesian(ylim = c(0, 5))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(,48)),size=6)+ labs(x=\(n=143)\, y=\Shannon index\)+my16stheme+theme(legend.position=) fig4A

rr fig5A<-ggpaired(Placebo1218p,x=, y=, line.size = 0.1,line.color = #5C5B58,fill = ,palette= c(#dab600, #554904))+coord_cartesian(ylim = c(0, 5))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(48, 72)),size=6)+ labs(x=\(n=112)\, y=\Shannon index\)+my16stheme+theme(legend.position=, axis.title.y =element_blank(), axis.line = element_line(size = 0.1, colour = )) fig5A

rr fig6A<-ggpaired(Placebo018p,x=, y=, line.size = 0.1, line.color = #5C5B58,fill = , palette= c(#fff9ae, #554904))+coord_cartesian(ylim = c(0, 5))+ stat_compare_means( paired=TRUE, method= .test,comparisons=list(c(, 72)),size=6)+ labs(x=\(n=110)\, y=\Shannon index\)+my16stheme+theme(legend.position=, axis.title.y =element_blank(), axis.line = element_line(size = 0.1, colour = )) fig6A

rr library(cowplot) Placebo_all_visitShannon<-cowplot::plot_grid(fig4A,fig5A,fig6A,legPla, nrow = 1, ncol = 4, rel_widths = c(2.3,2,2, 1) , rel_heights = c(2,2,2, 1), align = Placebo_all_visitShannon

rr temShannonA<-cowplot::plot_grid(azmplacA, AZM_all_visitShannon, Placebo_all_visitShannon, nrow = 3, ncol = 1, scale = .8, labels = c() AZM and Placebo at all visits, ) AZM arm only, ) Placebo arm only), label_size = 21, label_fontfamily = , label_fontface = , label_colour = blue,axis = align = vjust = c(2.5, 2.0,2.0), hjust = c(-1.6, -3.3, -2.7), rel_widths = c(2.5,5.5, 5.5)) temShannonA

ggsave(_final13thDec2021.pdf, temShannonA, width = 50, height = 50, units = )

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCkF1dGhvcjogUmVnaW5hIEVzaW5hbSBBYm90c2ksIERlcGFydG1lbnQgb2YgTW9sZWN1bGFyIGFuZCBDZWxsIEJpb2xvZ3ksIFVuaXZlcnNpdHkgb2YgQ2FwZSBUb3duLCBTb3V0aCBBZnJpY2EuCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoImNvd3Bsb3QiKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShwaHlsb3NlcSkKbGlicmFyeSAoZ2dzY2kpCmBgYAoKYGBge3J9Cm15MTZzdGhlbWUgPC0gdGhlbWVfYncoKSsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiLCBzaXplID0gKDI1KSksIAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSksCiAgICAgICAgcGFuZWwuc3BhY2luZz0gdW5pdCgwLjcsImNtIiksCiAgICAgICAgc3RyaXAudGV4dD0gZWxlbWVudF90ZXh0KHNpemU9MjAsIGZhbWlseSA9IkhlbHZldGljYSIsIGZhY2U9ImJvbGQiKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwgIGZhY2UgPSAiYm9sZCIsZmFtaWx5ID0iSGVsdmV0aWNhIixzaXplID0gKDIwKSksIAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGNvbG91cj0iYmxhY2siLGZhbWlseSA9ICJIZWx2ZXRpY2EiLHNpemUgPSAoMTgpICksIAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAoMjApLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkhlbHZldGljYSIsZmFjZSA9ICJib2xkIiwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9ICgxOCkpKQpgYGAKCgpgYGB7cn0KI0RhdGEgaW1wb3J0CnBoeSA8LSByZWFkUkRTKCJicmVhdGhlX3NwdXR1bV9waHlsb3NlcV90cmlhbF8xM0RlYzIwMjEuUkRTIikKVHJpYWwgPC1kYXRhLmZyYW1lIChzYW1wbGVfZGF0YShwaHkpKQoKIy0tLS0tLS0tLS1fX1N1YnNldHR0aW5nIGRhdGEtLS0tLS0tLS0tLS0tLS0tLQpjb2xuYW1lcyhUcmlhbCkKc3VtbWFyeShUcmlhbCR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKVHJpYWwkdGVtcGxhdGVETkFfMTZTcVBDUl9jb3BpZXMgPC1sb2cxMChUcmlhbCR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKc3VtbWFyeShUcmlhbCR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKCiMtLS0tLS1UcmlhbCBhcm1zLSBIb3cgbWFueSBzYW1wbGVzIHdlcmUgY29sbGVjdGVkIGZyb20gc2l0ZS1hdCBlYWNoIHRpbWVwb2ludC0tLS0tLS0tLS0tLQoKI3VzZSB0cmlhbCBhcm1zIGRhdGEgYW5kIHNwbGl0IGludG8gdGltZXBvaW50cyB0byBjb21wdXRlIGRhdGEgY29sbGVjdGVkIGF0IGVhY2ggZm9yIGVhY2ggYXJtCnRtcHRfMSA8LVRyaWFsW3doaWNoKFRyaWFsJHZpc2l0PT0iQmFzZWxpbmUiKSxdIzMzMQp0bXB0XzEyPC1UcmlhbFt3aGljaChUcmlhbCR2aXNpdD09IldlZWsgNDgiKSxdIzMwNAp0bXB0XzE4PC1UcmlhbFt3aGljaChUcmlhbCR2aXNpdD09IldlZWsgNzIiKSxdIzI0MAoKIy0tLVByZXZhbGVuY2UgVG90YWxzIGluIG1haW4gdHJpYWwgZGF0YS0tLS0tLS0tLS0tLS0KI1N1YnNldHRpbmcgZGF0YSBpbnRvIEFaTSBhbmQgcGxhY2VibwpBWk08LVRyaWFsW3doaWNoKFRyaWFsJHRyaWFsX2FybT09IkFaTSIpLF0jNDQxClBsYWNlYm88LVRyaWFsW3doaWNoKFRyaWFsJHRyaWFsX2FybT09IlBsYWNlYm8iKSxdIzQzNAoKQVpNMTwtdG1wdF8xW3doaWNoKHRtcHRfMSR0cmlhbF9hcm09PSJBWk0iKSxdIzE2NApBWk0xMjwtdG1wdF8xMlt3aGljaCh0bXB0XzEyJHRyaWFsX2FybT09IkFaTSIpLF0jMTU0CkFaTTE4PC10bXB0XzE4W3doaWNoKHRtcHRfMTgkdHJpYWxfYXJtPT0iQVpNIiksXSMxMjMKCkFaTTAxMjwtQVpNW3doaWNoKEFaTSR2aXNpdCE9IldlZWsgNzIiKSxdCkFaTTAxMnA8LUFaTVt3aGljaChBWk0kdmlzaXQhPSJXZWVrIDcyIiAmIEFaTSR2aXNpdDAxMj09InllcyIpLF0KQVpNMTIxOHA8LUFaTVt3aGljaChBWk0kdmlzaXQhPSJCYXNlbGluZSIgJiBBWk0kdmlzaXQxMjE4PT0ieWVzIiksXQpBWk0wMThwPC1BWk1bd2hpY2goQVpNJHZpc2l0IT0iV2VlayA0OCIgJiBBWk0kdmlzaXQwMTg9PSJ5ZXMiKSxdCkFaTTNwPC1BWk1bd2hpY2goQVpNJGFsbF8zPT0ieWVzIiksXQoKCgpQbGFjMTwtdG1wdF8xW3doaWNoKHRtcHRfMSR0cmlhbF9hcm09PSJQbGFjZWJvIiksXSMxNjcKUGxhYzEyPC10bXB0XzEyW3doaWNoKHRtcHRfMTIkdHJpYWxfYXJtPT0iUGxhY2VibyIpLF0jMTUwClBsYWMxODwtdG1wdF8xOFt3aGljaCh0bXB0XzE4JHRyaWFsX2FybT09IlBsYWNlYm8iKSxdIzExNwoKUGxhY2VibzAxMnA8LVBsYWNlYm9bd2hpY2goUGxhY2VibyR2aXNpdCE9IldlZWsgNzIiICYgUGxhY2VibyR2aXNpdDAxMj09InllcyIpLF0KUGxhY2VibzEyMThwPC1QbGFjZWJvW3doaWNoKFBsYWNlYm8kdmlzaXQhPSJCYXNlbGluZSIgJiBQbGFjZWJvJHZpc2l0MTIxOD09InllcyIpLF0KUGxhY2VibzAxOHA8LVBsYWNlYm9bd2hpY2goUGxhY2VibyR2aXNpdCE9IldlZWsgNDgiICYgUGxhY2VibyR2aXNpdDAxOD09InllcyIpLF0KUGxhY2VibzNwPC1QbGFjZWJvW3doaWNoKFBsYWNlYm8kYWxsXzM9PSJ5ZXMiKSxdCgpgYGAKCmBgYHtyfQoKI1N1bW1hcnkgZm9yIFRhYmxlIDEKc3VtbWFyeShBWk0xJHRlbXBsYXRlRE5BXzE2U3FQQ1JfY29waWVzKQpzZChBWk0xJHRlbXBsYXRlRE5BXzE2U3FQQ1JfY29waWVzKQpzaGFwaXJvLnRlc3QoQVpNMSR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKc3VtbWFyeShQbGFjMSR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKc2QoUGxhYzEkdGVtcGxhdGVETkFfMTZTcVBDUl9jb3BpZXMpCnNoYXBpcm8udGVzdChQbGFjMSR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKd2lsY294LnRlc3QoQVpNMSR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcyxQbGFjMSR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKdC50ZXN0KEFaTTEkdGVtcGxhdGVETkFfMTZTcVBDUl9jb3BpZXMsUGxhYzEkdGVtcGxhdGVETkFfMTZTcVBDUl9jb3BpZXMpCgpzdW1tYXJ5KEFaTTEkU2hhbm5vbikKc2hhcGlyby50ZXN0KEFaTTEkU2hhbm5vbikKc3VtbWFyeShQbGFjMSRTaGFubm9uKQpzaGFwaXJvLnRlc3QoUGxhYzEkU2hhbm5vbikKd2lsY294LnRlc3QoQVpNMSRTaGFubm9uLFBsYWMxJFNoYW5ub24gKQoKCnN1bW1hcnkoQVpNMSRTaW1wc29uKQpzaGFwaXJvLnRlc3QoQVpNMSRTaW1wc29uKQpzdW1tYXJ5KFBsYWMxJFNpbXBzb24pCnNoYXBpcm8udGVzdChQbGFjMSRTaW1wc29uKQp3aWxjb3gudGVzdChBWk0xJFNpbXBzb24sUGxhYzEkU2ltcHNvbiApCgpzaGFwaXJvLnRlc3QoVHJpYWwkdGVtcGxhdGVETkFfMTZTcVBDUl9jb3BpZXMpCgojU3VtbWFyeSBmb3IgaW50ZXh0IDE2UyByZXN1bHRzCnN1bW1hcnkoVHJpYWwkdGVtcGxhdGVETkFfMTZTcVBDUl9jb3BpZXMpCnN1bW1hcnkoQVpNMSR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKc3VtbWFyeShQbGFjMSR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKc3VtbWFyeShBWk0xMiR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKc3VtbWFyeShQbGFjMTIkdGVtcGxhdGVETkFfMTZTcVBDUl9jb3BpZXMpCgpzdW1tYXJ5KEFaTTE4JHRlbXBsYXRlRE5BXzE2U3FQQ1JfY29waWVzKQpzdW1tYXJ5KFBsYWMxOCR0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcykKCgpzdW1tYXJ5KFBsYWMxJFNoYW5ub24pCgpzdW1tYXJ5KFBsYWMxMiRTaGFubm9uKQoKd2lsY294LnRlc3QoU2hhbm5vbn52aXNpdCwgZGF0YT1QbGFjZWJvMDEycCkKYGBgCgoKCiNBWk0gYW5kIFBsYWNlYm8gYXQgYWxsIHZpc2l0cwpgYGB7cn0KYXptcGxhYzwtZ2dwbG90KFRyaWFsLCBhZXMoeD10cmlhbF9hcm0sIHk9dGVtcGxhdGVETkFfMTZTcVBDUl9jb3BpZXMsIHNoYXBlPXRyaWFsX2FybSwgZmlsbD10cmlhbF9hcm0pKSArIAogIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSsKICBnZW9tX2JveHBsb3QoKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0EwODdCQyIsICIjRkZGNDY4IikpKwogIGZhY2V0X3dyYXAoInZpc2l0IikrY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDIsIDgpKSsKICAjc3RhdF9zdW1tYXJ5KGZ1biA9ICJtZWRpYW4iLHNpemUgPSAwLjUpKwogIHN0YXRfY29tcGFyZV9tZWFucyggbWV0aG9kPSAid2lsY294LnRlc3QiLGNvbXBhcmlzb25zPWxpc3QoYygiQVpNIiwgIlBsYWNlYm8iKSksIHNpemU9NikrCiAgbGFicyh4PU5VTEwsCiAgICAgICB5PSIxNlMgY29waWVzIGluIGxvZzEwIikrbXkxNnN0aGVtZQogYXptcGxhYwoKYGBgCiNBWk0gYXQgYmFzZWxpbmUgYW5kIDQ4IHdlZWtzCmBgYHtyfQpmaWcxPC1nZ3BhaXJlZChBWk0wMTJwLHg9InZpc2l0IiwgeT0idGVtcGxhdGVETkFfMTZTcVBDUl9jb3BpZXMiLCBsaW5lLnNpemUgPSAwLjEsbGluZS5jb2xvciA9ICIjNUM1QjU4IiwgZmlsbCA9ICJ2aXNpdCIsIHBhbGV0dGU9IGMoIiNFMUQwRkYiLCAiIzg2NjJCRCIpKStjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMiwgOCkpKwogIHN0YXRfY29tcGFyZV9tZWFucyggcGFpcmVkPVRSVUUsIG1ldGhvZD0gIndpbGNveC50ZXN0Iixjb21wYXJpc29ucz1saXN0KGMoIkJhc2VsaW5lIiwgIldlZWsgNDgiKSksIHNpemU9NikrIAogIGxhYnMoeD0iQVpNIGF0IEJhc2VsaW5lIGFuZCA0OCAobj0xNDYpIiwKICAgICAgIHk9IjE2UyBjb3BpZXMgaW4gbG9nMTAiKStteTE2c3RoZW1lK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmZpZzEKYGBgCiNBWk0gYXQgNDggYW5kIDcyIHdlZWtzCmBgYHtyfQpmaWcyPC1nZ3BhaXJlZChBWk0xMjE4cCx4PSJ2aXNpdCIsIHk9InRlbXBsYXRlRE5BXzE2U3FQQ1JfY29waWVzIiwgbGluZS5zaXplID0gMC4xLCBsaW5lLmNvbG9yID0gIiM1QzVCNTgiLGZpbGwgPSAidmlzaXQiLCBwYWxldHRlPSBjKCIjODY2MkJEIiwgIiMzMjIyNEEiKSkrY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDIsIDgpKSsKICBzdGF0X2NvbXBhcmVfbWVhbnMoIHBhaXJlZD1UUlVFLCBtZXRob2Q9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnM9bGlzdChjKCJXZWVrIDQ4IiwgIldlZWsgNzIiKSksIHNpemU9NikrCiAgbGFicyh4PSJBWk0gYXQgV2VlayA0OCBhbmQgNzIgKG49MTE2KSIsCiAgICAgICB5PSIxNlMgY29waWVzIGluIGxvZzEwIikrbXkxNnN0aGVtZSt0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpmaWcyCmBgYAoKI0FaTSBhdCBiYXNlbGluZSBhbmQgNzIgd2Vla3MKYGBge3J9CmZpZzM8LWdncGFpcmVkKEFaTTAxOHAseD0idmlzaXQiLCB5PSJ0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcyIsIGxpbmUuc2l6ZSA9IDAuMSxsaW5lLmNvbG9yID0gIiM1QzVCNTgiLCBmaWxsID0gInZpc2l0IixwYWxldHRlPSBjKCIjRTFEMEZGIiwgIiMzMjIyNEEiKSkrY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDIsIDgpKSsKICBzdGF0X2NvbXBhcmVfbWVhbnMoIHBhaXJlZD1UUlVFLCBtZXRob2Q9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnM9bGlzdChjKCJCYXNlbGluZSIsICJXZWVrIDcyIikpLCBzaXplPTYpKwogIGxhYnMoeD0iQVpNIGF0IFdlZWsgNDggYW5kIDcyIChuPTExNSkiLAogICAgICAgeT0iMTZTIGNvcGllcyBpbiBsb2cxMCIpK215MTZzdGhlbWUrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKZmlnMwoKYGBgCgojT2J0YWluaW5nIGxlZ2VuZHMKI0FaTQoKYGBge3J9CmxpYnJhcnkgKGdnc2NpKQpmaWcxbGVnPC1nZ3BhaXJlZChBWk0zcCx4PSJ2aXNpdCIsIHk9InRlbXBsYXRlRE5BXzE2U3FQQ1JfY29waWVzIiwgbGluZS5zaXplID0gMC4xLGxpbmUuY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInZpc2l0IiwgcGFsZXR0ZT0gYygiI0UxRDBGRiIsIiM4NjYyQkQiLCIjMzIyMjRBIikpK2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYygyLCA4KSkrCiAgI3N0YXRfY29tcGFyZV9tZWFucyggcGFpcmVkPVRSVUUsIG1ldGhvZD0gImFub3ZhIixjb21wYXJpc29ucz1saXN0KGMoIkJhc2VsaW5lIiwgIldlZWsgNDgiLCAiV2VlayA3MiIpKSwgc2l6ZT02KSsgCiAgbGFicyh4PSJBWk0gYXQgdmlzaXRzIiwKICAgICAgIHk9IjE2UyBjb3BpZXMgaW4gbG9nMTAiKStteTE2c3RoZW1lCmZpZzFsZWcKCiMgRXh0cmFjdCB0aGUgbGVnZW5kLiBSZXR1cm5zIGEgZ3RhYmxlCmxlZyA8LSBnZXRfbGVnZW5kKGZpZzFsZWcpCgojIENvbnZlcnQgdG8gYSBnZ3Bsb3QgYW5kIHByaW50CmxlZ0FaTTwtYXNfZ2dwbG90KGxlZykKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KGNvd3Bsb3QpCkFaTV9hbGxfdmlzaXQxNlNjb3BpZXM8LWNvd3Bsb3Q6OnBsb3RfZ3JpZChmaWcxLGZpZzIsIGZpZzMsbGVnQVpNLCBucm93ID0gMSwgbmNvbCA9IDQsIHJlbF93aWR0aHMgPSBjKDIsMiwyLCAxKSAsIHJlbF9oZWlnaHRzID0gYygyLDIsMiwgMSkpCkFaTV9hbGxfdmlzaXQxNlNjb3BpZXMKYGBgCgoKI1BsYWNlYm8KCmBgYHtyfQojUGxhY2VibwojQmFzZWxpbmUgYW5kIFdlZWsgNDgKZmlnNDwtZ2dwYWlyZWQoUGxhY2VibzAxMnAseD0idmlzaXQiLCB5PSJ0ZW1wbGF0ZUROQV8xNlNxUENSX2NvcGllcyIsIGxpbmUuc2l6ZSA9IDAuMSwgbGluZS5jb2xvciA9ICIjNUM1QjU4IixmaWxsID0gInZpc2l0IiwgcGFsZXR0ZT0gYygiI2ZmZjlhZSIsICIjZGFiNjAwIikpK2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYygyLCA4KSkrCiAgc3RhdF9jb21wYXJlX21lYW5zKCBwYWlyZWQ9VFJVRSwgbWV0aG9kPSAid2lsY294LnRlc3QiLGNvbXBhcmlzb25zPWxpc3QoYygiQmFzZWxpbmUiLCAiV2VlayA0OCIpKSwgc2l6ZT02KSsKICBsYWJzKHg9IlBsYWNlYm8gYXQgQmFzZWxpbmUgYW5kICA0OCAobj0xNDMpIiwKICAgICAgIHk9IjE2UyBjb3BpZXMgaW4gbG9nMTAiKStteTE2c3RoZW1lK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpmaWc0CmBgYAoKCgoKYGBge3J9CmZpZzU8LWdncGFpcmVkKFBsYWNlYm8xMjE4cCx4PSJ2aXNpdCIsIHk9InRlbXBsYXRlRE5BXzE2U3FQQ1JfY29waWVzIiwgbGluZS5zaXplID0gMC4xLCBsaW5lLmNvbG9yID0gIiM1QzVCNTgiLGZpbGwgPSAidmlzaXQiLCAgcGFsZXR0ZT0gYygiI2RhYjYwMCIsICIjNTU0OTA0IikpK2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYygyLCA4KSkrCiAgc3RhdF9jb21wYXJlX21lYW5zKCBwYWlyZWQ9VFJVRSwgbWV0aG9kPSAid2lsY294LnRlc3QiLGNvbXBhcmlzb25zPWxpc3QoYygiV2VlayA0OCIsICJXZWVrIDcyIikpLHNpemU9NikrCiAgbGFicyh4PSJQbGFjZWJvIGF0IFdlZWsgNDggYW5kIDcyIChuPTExMikiLAogICAgICAgeT0iMTZTIGNvcGllcyBpbiBsb2cxMCIpK215MTZzdGhlbWUrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKZmlnNQoKCmBgYAoKCmBgYHtyfQpmaWc2PC1nZ3BhaXJlZChQbGFjZWJvMDE4cCx4PSJ2aXNpdCIsIHk9InRlbXBsYXRlRE5BXzE2U3FQQ1JfY29waWVzIiwgbGluZS5zaXplID0gMC4xLGxpbmUuY29sb3IgPSAiIzVDNUI1OCIsIGZpbGwgPSAidmlzaXQiLCBwYWxldHRlPSBjKCIjZmZmOWFlIiwgIiM1NTQ5MDQiKSkrY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDIsIDgpKSsKICBzdGF0X2NvbXBhcmVfbWVhbnMoIHBhaXJlZD1UUlVFLCBtZXRob2Q9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnM9bGlzdChjKCJCYXNlbGluZSIsICJXZWVrIDcyIikpLHNpemU9NikrCiAgbGFicyh4PSJQbGFjZWJvIGF0IEJhc2VsaW5lIGFuZCA3MiAobj0xMTApIiwKICAgICAgIHk9IjE2UyBjb3BpZXMgaW4gbG9nMTAiKStteTE2c3RoZW1lK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmZpZzYKCmBgYAoKI1BsYWNlYm8gbGVnZW5kCmBgYHtyfQpsaWJyYXJ5IChnZ3NjaSkKI1BsYWNlYm8zcCBub3Qgd29ya2luZyBzbyBBWk0zcCB1c2VkIGJ1dCB3aXRoIGRpZmZlcmVudCBjb2xvcnMgdG8gZ2VuZXJhdGUgdGhlIFBsYWNlYm8gbGVnZW5kCmZpZzF0PC1nZ3BhaXJlZChBWk0zcCx4PSJ2aXNpdCIsIHk9InRlbXBsYXRlRE5BXzE2U3FQQ1JfY29waWVzIiwgbGluZS5zaXplID0gMC4xLGxpbmUuY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInZpc2l0IiwgcGFsZXR0ZT0gYygiI2ZmZjlhZSIsIiNkYWI2MDAiLCAiIzU1NDkwNCIpKStjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMiwgOCkpKwogICNzdGF0X2NvbXBhcmVfbWVhbnMoIHBhaXJlZD1UUlVFLCBtZXRob2Q9ICJhbm92YSIsY29tcGFyaXNvbnM9bGlzdChjKCJCYXNlbGluZSIsICJXZWVrIDQ4IiwgIldlZWsgNzIiKSksIHNpemU9NikrIAogIGxhYnMoeD0iUGxhY2VibyBhdCBhbGwgdmlzaXRzIiwKICAgICAgIHk9IjE2UyBjb3BpZXMgaW4gbG9nMTAiKStteTE2c3RoZW1lCmZpZzF0CgojIEV4dHJhY3QgdGhlIGxlZ2VuZC4gUmV0dXJucyBhIGd0YWJsZQpsZWcgPC0gZ2V0X2xlZ2VuZChmaWcxdCkKCiMgQ29udmVydCB0byBhIGdncGxvdCBhbmQgcHJpbnQKbGVnUGxhPC1hc19nZ3Bsb3QobGVnKQpgYGAKCgoKCmBgYHtyfQpsaWJyYXJ5KGNvd3Bsb3QpClBsYWNlYm9fYWxsX3Zpc2l0MTZTY29waWVzPC1jb3dwbG90OjpwbG90X2dyaWQoZmlnNCxmaWc1LGZpZzYsbGVnUGxhLCBucm93ID0gMSwgbmNvbCA9IDQsIHJlbF93aWR0aHMgPSBjKDIsMiwyLCAxKSAsIHJlbF9oZWlnaHRzID0gYygyLDIsMiwgMSkpClBsYWNlYm9fYWxsX3Zpc2l0MTZTY29waWVzCgpgYGAKCmBgYHtyfQp0ZW0xNlM8LWNvd3Bsb3Q6OnBsb3RfZ3JpZChhem1wbGFjLCBBWk1fYWxsX3Zpc2l0MTZTY29waWVzLCBQbGFjZWJvX2FsbF92aXNpdDE2U2NvcGllcywgbnJvdyA9IDMsIG5jb2wgPSAxLCBzY2FsZSA9IC45LCB2anVzdD0xLjUsIGhqdXN0PSBjKC0zLjUsLTYuMiwtNS4wKSwgbGFiZWxzID0gYygiQVpNIHZzLiBQbGFjZWJvIGF0IGFsbCB2aXNpdHMiLCAiQVpNIHNhbXBsZXMgb25seSBhdCBhbGwgdmlzaXRzIiwgIlBsYWNlYm8gc2FtcGxlcyBvbmx5IGF0IGFsbCB2aXNpdHMiKSwgbGFiZWxfc2l6ZSA9IDIwLCBsYWJlbF9mb250ZmFtaWx5ID0gIkhlbHZldGljYSIsIGxhYmVsX2ZvbnRmYWNlID0gImJvbGQiKQp0ZW0xNlMKCnRlbTE2U2I8LWNvd3Bsb3Q6OnBsb3RfZ3JpZChhem1wbGFjLCBBWk1fYWxsX3Zpc2l0MTZTY29waWVzLCBQbGFjZWJvX2FsbF92aXNpdDE2U2NvcGllcywgbnJvdyA9IDMsIG5jb2wgPSAxLCBzY2FsZSA9IC44NSwgdmp1c3Q9MS41LCBoanVzdD0gYygtMS45MiwtMS44MiwtMS42KSwgbGFiZWxzID0gYygiQSkgQVpNIHZzLiBQbGFjZWJvIGF0IGFsbCB2aXNpdHMiLCAiQikgQVpNIHNhbXBsZXMgb25seSBhdCBhbGwgdmlzaXRzIiwgIkMpIFBsYWNlYm8gc2FtcGxlcyBvbmx5IGF0IGFsbCB2aXNpdHMiKSwgbGFiZWxfc2l6ZSA9IDIwLCBsYWJlbF9mb250ZmFtaWx5ID0gIkhlbHZldGljYSIsIGxhYmVsX2ZvbnRmYWNlID0gImJvbGQiLCBsYWJlbF9jb2xvdXIgPSAiZGFyayBibHVlIikKdGVtMTZTYgoKCmdnc2F2ZSgiMTZTX2NvcGllc19maW5hbDEzdGhEZWMucGRmIiwgdGVtMTZTYiwgIHdpZHRoID0gNTUsIGhlaWdodCA9IDUwLCB1bml0cyA9ICJjbSIpCmBgYAoKCgoKI0FMUEhBIERJVkVSU0lUWQoKI0FaTSBhbmQgUGxhY2VibyBhdCBhbGwgdmlzaXRzCmBgYHtyfQojU2hhbm5vbgojQVpNIGFuZCBQbGFjZWJvIGF0IHRocmVlIHRpbWVwb2ludAojRmluYWwKYXptcGxhY0E8LWdncGxvdChUcmlhbCwgYWVzKHg9dHJpYWxfYXJtLCB5PVNoYW5ub24sIHNoYXBlPXRyaWFsX2FybSwgZmlsbD10cmlhbF9hcm0pKSArIAogIGdlb21faml0dGVyKHdpZHRoID0gMC4yKStjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNC41KSkrCiAgZ2VvbV9ib3hwbG90KCkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNBMDg3QkMiLCAiI0ZGRjQ2OCIpKSsKICBmYWNldF93cmFwKCJ2aXNpdCIpKwogICNzdGF0X3N1bW1hcnkoZnVuID0gIm1lZGlhbiIsIGdlb20gPSAiY3Jvc3NiYXIiLHdpZHRoPTAuNSxzaXplID0gMC41LCBjb2xvciA9ICJyZWQzIikrCiAgc3RhdF9jb21wYXJlX21lYW5zKCBtZXRob2Q9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnM9bGlzdChjKCJBWk0iLCAiUGxhY2VibyIpKSxzaXplPTYpKwogIGxhYnMoIHg9TlVMTCwKICAgICAgIHk9IlNoYW5ub24gaW5kZXgiKSsKICBteTE2c3RoZW1lCmF6bXBsYWNBCgpgYGAKCgoKCgojQVpNIGF0IGJhc2VsaW5lIGFuZCA0OCB3ZWVrcwoKYGBge3J9CiNBeml0aHJvbXljaW4KI0Jhc2VsaW5lIGFuZCBXZWVrIDQ4CmZpZzFBPC1nZ3BhaXJlZChBWk0wMTJwLHg9InZpc2l0IiwgeT0iU2hhbm5vbiIsIGxpbmUuc2l6ZSA9IDAuMSxsaW5lLmNvbG9yID0gIiM1QzVCNTgiLCBmaWxsID0gInZpc2l0IiwgcGFsZXR0ZT0gYygiI0UxRDBGRiIsICIjODY2MkJEIikpK2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA0LjUpKSsKICBzdGF0X2NvbXBhcmVfbWVhbnMoIHBhaXJlZD1UUlVFLCBtZXRob2Q9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnM9bGlzdChjKCJCYXNlbGluZSIsICJXZWVrIDQ4IikpLHNpemU9NikrCiAgbGFicyh4PSIobj0xNDYpIiwKICAgICAgIHk9IlNoYW5ub24gaW5kZXgiKStteTE2c3RoZW1lK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmZpZzFBCmBgYAoKI0FaTSBhdCA0OCBhbmQgNzIgd2Vla3MKCgpgYGB7cn0KZmlnMkE8LWdncGFpcmVkKEFaTTEyMThwLHg9InZpc2l0IiwgeT0iU2hhbm5vbiIsIGxpbmUuc2l6ZSA9IDAuMSxsaW5lLmNvbG9yID0gIiM1QzVCNTgiLCBmaWxsID0gInZpc2l0IiwgcGFsZXR0ZT0gYygiIzg2NjJCRCIsICIjMzIyMjRBIikpK2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA0LjUpKSsKICBzdGF0X2NvbXBhcmVfbWVhbnMoIHBhaXJlZD1UUlVFLCBtZXRob2Q9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnM9bGlzdChjKCJXZWVrIDQ4IiwgIldlZWsgNzIiKSksc2l6ZT02KSsKICBsYWJzKHg9IihuPTExNikiLAogICAgICAgeT0iU2hhbm5vbiBpbmRleCIpK215MTZzdGhlbWUrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50aXRsZS55ID1lbGVtZW50X2JsYW5rKCksYXhpcy5saW5lID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjEsIGNvbG91ciA9ICJibGFjayIpICkKZmlnMkEKYGBgCgoKI0FaTSBhdCBiYXNlbGluZSBhbmQgNzIgd2Vla3MKCgoKYGBge3J9CmZpZzNBPC1nZ3BhaXJlZChBWk0wMThwLHg9InZpc2l0IiwgeT0iU2hhbm5vbiIsIGxpbmUuc2l6ZSA9IDAuMSwgbGluZS5jb2xvciA9ICIjNUM1QjU4IixmaWxsID0gInZpc2l0IiwgcGFsZXR0ZT0gYygiI0UxRDBGRiIsICIjMzIyMjRBIikpK2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA0LjUpKSsKICBzdGF0X2NvbXBhcmVfbWVhbnMoIHBhaXJlZD1UUlVFLCBtZXRob2Q9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnM9bGlzdChjKCJCYXNlbGluZSIsICJXZWVrIDcyIikpLHNpemU9NikrCiAgbGFicyh4PSIobj0xMTUpIiwKICAgICAgIHk9IlNoYW5ub24gaW5kZXgiKStteTE2c3RoZW1lK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIGF4aXMudGl0bGUueSA9ZWxlbWVudF9ibGFuaygpLCAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjEsIGNvbG91ciA9ICJibGFjayIpKQpmaWczQQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGNvd3Bsb3QpCkFaTV9hbGxfdmlzaXRTaGFubm9uPC1jb3dwbG90OjpwbG90X2dyaWQoZmlnMUEsZmlnMkEsIGZpZzNBLGxlZ0FaTSwgbnJvdyA9IDEsIG5jb2wgPSA0LCByZWxfd2lkdGhzID0gYygyLjMsMiwyLCAxKSAsIHJlbF9oZWlnaHRzID0gYygyLDIsMiwgMSksIGFsaWduID0gImgiKQpBWk1fYWxsX3Zpc2l0U2hhbm5vbgpgYGAKCgoKI1BsYWNlYm8KCgpgYGB7cn0KI1BsYWNlYm8KI0Jhc2VsaW5lIGFuZCBXZWVrIDQ4CgpmaWc0QTwtZ2dwYWlyZWQoUGxhY2VibzAxMnAseD0idmlzaXQiLCB5PSJTaGFubm9uIiwgbGluZS5zaXplID0gMC4xLGxpbmUuY29sb3IgPSAiIzVDNUI1OCIsIGZpbGwgPSAidmlzaXQiLHBhbGV0dGU9IGMoIiNmZmY5YWUiLCAiI2RhYjYwMCIpKStjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNSkpKwogIHN0YXRfY29tcGFyZV9tZWFucyggcGFpcmVkPVRSVUUsIG1ldGhvZD0gIndpbGNveC50ZXN0Iixjb21wYXJpc29ucz1saXN0KGMoIkJhc2VsaW5lIiwiV2VlayA0OCIpKSxzaXplPTYpKwogIGxhYnMoeD0iKG49MTQzKSIsCiAgICAgICB5PSJTaGFubm9uIGluZGV4IikrbXkxNnN0aGVtZSt0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpmaWc0QQpgYGAKCgpgYGB7cn0KZmlnNUE8LWdncGFpcmVkKFBsYWNlYm8xMjE4cCx4PSJ2aXNpdCIsIHk9IlNoYW5ub24iLCBsaW5lLnNpemUgPSAwLjEsbGluZS5jb2xvciA9ICIjNUM1QjU4IixmaWxsID0gInZpc2l0IixwYWxldHRlPSBjKCIjZGFiNjAwIiwgIiM1NTQ5MDQiKSkrY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDUpKSsKICBzdGF0X2NvbXBhcmVfbWVhbnMoIHBhaXJlZD1UUlVFLCBtZXRob2Q9ICJ3aWxjb3gudGVzdCIsY29tcGFyaXNvbnM9bGlzdChjKCJXZWVrIDQ4IiwgIldlZWsgNzIiKSksc2l6ZT02KSsKICBsYWJzKHg9IihuPTExMikiLAogICAgICAgeT0iU2hhbm5vbiBpbmRleCIpK215MTZzdGhlbWUrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50aXRsZS55ID1lbGVtZW50X2JsYW5rKCksICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMSwgY29sb3VyID0gImJsYWNrIikpCmZpZzVBCmBgYAoKCgpgYGB7cn0KZmlnNkE8LWdncGFpcmVkKFBsYWNlYm8wMThwLHg9InZpc2l0IiwgeT0iU2hhbm5vbiIsIGxpbmUuc2l6ZSA9IDAuMSwgbGluZS5jb2xvciA9ICIjNUM1QjU4IixmaWxsID0gInZpc2l0IiwgcGFsZXR0ZT0gYygiI2ZmZjlhZSIsICIjNTU0OTA0IikpK2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA1KSkrCiAgc3RhdF9jb21wYXJlX21lYW5zKCBwYWlyZWQ9VFJVRSwgbWV0aG9kPSAid2lsY294LnRlc3QiLGNvbXBhcmlzb25zPWxpc3QoYygiQmFzZWxpbmUiLCAiV2VlayA3MiIpKSxzaXplPTYpKwogIGxhYnMoeD0iKG49MTEwKSIsCiAgICAgICB5PSJTaGFubm9uIGluZGV4IikrbXkxNnN0aGVtZSt0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBheGlzLnRpdGxlLnkgPWVsZW1lbnRfYmxhbmsoKSwgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC4xLCBjb2xvdXIgPSAiYmxhY2siKSkKZmlnNkEKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KGNvd3Bsb3QpClBsYWNlYm9fYWxsX3Zpc2l0U2hhbm5vbjwtY293cGxvdDo6cGxvdF9ncmlkKGZpZzRBLGZpZzVBLGZpZzZBLGxlZ1BsYSwgbnJvdyA9IDEsIG5jb2wgPSA0LCByZWxfd2lkdGhzID0gYygyLjMsMiwyLCAxKSAsIHJlbF9oZWlnaHRzID0gYygyLDIsMiwgMSksIGFsaWduID0gImgiKQpQbGFjZWJvX2FsbF92aXNpdFNoYW5ub24KYGBgCgoKCgpgYGB7cn0KdGVtU2hhbm5vbkE8LWNvd3Bsb3Q6OnBsb3RfZ3JpZChhem1wbGFjQSwgQVpNX2FsbF92aXNpdFNoYW5ub24sIFBsYWNlYm9fYWxsX3Zpc2l0U2hhbm5vbiwgbnJvdyA9IDMsIG5jb2wgPSAxLCBzY2FsZSA9IC44LCBsYWJlbHMgPSBjKCJBKSBBWk0gYW5kIFBsYWNlYm8gYXQgYWxsIHZpc2l0cyIsICJCKSBBWk0gYXJtIG9ubHkiLCAiQykgUGxhY2VibyBhcm0gb25seSIpLCBsYWJlbF9zaXplID0gMjEsIGxhYmVsX2ZvbnRmYW1pbHkgPSAiSGVsdmV0aWNhIiwgbGFiZWxfZm9udGZhY2UgPSAiYm9sZCIsIGxhYmVsX2NvbG91ciA9ICJkYXJrIGJsdWUiLGF4aXMgPSAiciIsYWxpZ24gPSAiaCIsIHZqdXN0ID0gYygyLjUsIDIuMCwyLjApLCBoanVzdCA9IGMoLTEuNiwgLTMuMywgLTIuNyksICByZWxfd2lkdGhzID0gYygyLjUsNS41LCA1LjUpKQp0ZW1TaGFubm9uQQoKCmdnc2F2ZSgiU2hhbm5vbl9maW5hbDEzdGhEZWMyMDIxLnBkZiIsIHRlbVNoYW5ub25BLCAgd2lkdGggPSA1MCwgaGVpZ2h0ID0gNTAsIHVuaXRzID0gImNtIikKYGBgCgoK